/*
 * Niiuzu
 * Copyright (C) 2011  Thierry Nowak
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.niiuzu.server.dao.impl.dto.mapping;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.niiuzu.server.dao.impl.dto.object.DtoObject;
import com.niiuzu.server.dao.impl.util.KeyUtil;

/**
 * Classe destinée à mapper des instances sérialisables (type S) vers des
 * intances DTO (type D), et inversement.
 * 
 * @param <S>
 *            type de la classe sérialisable.
 * @param <D>
 *            type de la classe DTO.
 */
public abstract class AbstractMapper<S extends Serializable, D extends DtoObject> {

	/**
	 * Génère une instance sérialisable à partir d'une instance DTO.
	 */
	public abstract S mapDtoToSerializable(D dtoObject);

	/**
	 * Génère une instance DTO à partir d'une instance sérialisable.
	 */
	public abstract D mapSerializableToDto(S serializableObject);

	/**
	 * Génère une liste d'instances sérialisables à partir d'une liste
	 * d'instances DTO.
	 */
	public List<S> mapDtoToSerializableList(List<D> dtoObjectList) {

		if (dtoObjectList == null) {
			return null;
		}

		List<S> serializableObjectList = new ArrayList<S>(dtoObjectList.size());
		for (D dtoObject : dtoObjectList) {
			serializableObjectList.add(mapDtoToSerializable(dtoObject));
		}
		return serializableObjectList;
	}

	/**
	 * Génère une liste d'instances DTO à partir d'une liste d'instances
	 * sérialisables.
	 */
	public List<D> mapSerializableToDtoList(List<S> serializableObjectList) {

		if (serializableObjectList == null) {
			return null;
		}

		List<D> dtoObjectList = new ArrayList<D>(serializableObjectList.size());
		for (S serializableObject : serializableObjectList) {
			dtoObjectList.add(mapSerializableToDto(serializableObject));
		}
		return dtoObjectList;
	}

	/**
	 * Récupère une instance de {@link KeyUtil}.
	 */
	protected KeyUtil getKeyUtil() {
		if (mockedKeyUtil != null) {
			return mockedKeyUtil;
		}
		return new KeyUtil();
	}

	/* ********************************************************************** */
	/* ********************************************************************** */
	/* ********************************************************************** */

	private KeyUtil mockedKeyUtil;

	/**
	 * JUnit - définit un mock pour {@link KeyUtil}.
	 */
	void setMockedKeyUtil(KeyUtil mockedKeyUtil) {
		this.mockedKeyUtil = mockedKeyUtil;
	}

}
